﻿//Auktionshus projekt, DM10X2, Anders Østergaard, Jesper Larsen og Mads Jakobsen, 19.9.2011

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Auktion
{
        public class ServerMonitor
        {
            private List<KlientTråd> broadCastListe; //liste af klienter der er tilmeldt auktionen
            AuktionsMonitor AukMon;
            private bool Lyt = true;

            public delegate void SeAntalBydere(int antal);
            public event SeAntalBydere AntalByderEvent;

            //Auktionsdetaljer
            string auktionsNavn;
            int mindstepris;

            private object read_update_lock = new object(); // for lock ved kritisk sektion

            public ServerMonitor(AuktionsMonitor aukm)
            {

                    broadCastListe = new List<KlientTråd>();
                    this.AukMon = aukm;
                    Thread.Sleep(20);
                    Thread antalKlienter = new Thread(LytPåKlientListe); //tråd der fortæller serveren hvor mange tilmeldte der er
                    antalKlienter.Start();
            }

            

            public void Tilmeld(KlientTråd subscriber)
            {
                lock (read_update_lock)
                {
                    this.broadCastListe.Add(subscriber);
                }
            }
            public void Afmeld(KlientTråd subscriber)
            {
                lock (read_update_lock)
                {
                    this.broadCastListe.Remove(subscriber);
                }
            }
            public void BroadCastMessage(string msg, string KlientIP ) 
            {
                lock (read_update_lock)
                {
                    try
                    {
                        int pris = Convert.ToInt32(msg); //er beskeden en int(pris) skal alle have det at vide
                        foreach (KlientTråd klient in broadCastListe)
                        {
                            klient.sendTilKlient(KlientIP);
                            klient.sendTilKlient(msg); //sender det godkendte bud tilbage

                        }
                    }
                    catch (Exception)
                    {
                        foreach (KlientTråd klient in broadCastListe)
                        {
                            if (msg[0].ToString() == "H" && msg[1].ToString() == "a") //betyder der er foretaget et HAMMERSLAG
                            {
                                klient.sendTilKlient(AukMon.AktuelIpAdresse.ToString()); //den vindende ip sendes med
                                klient.sendTilKlient(msg); //sender hammerslag til byderne
                                if (msg.EndsWith("SOLGT!")) //Auktionen er SLUT og hammerslagstråden lukkes ved signalskift
                                {
                                    AukMon.StartHammerSlag1 = true;
                                    AukMon.StartHammerSlag21 = false;
                                }
                            }
                            if (klient.KlientIP1.ToString() == KlientIP) //hvis den vindende IP findes i listen og matcher den registrede vindende IP
                            {                                           //så sendes der en besked til ud om der er vundet
                                klient.sendTilKlient(KlientIP);
                                klient.sendTilKlient(msg);
                            }
                        }
                    }                    
                }
            }

            ////auktionerne
            public void SætAuktionsDetaljer(string navn, int pris) //sætter auktionens detaljer
            {
                lock (read_update_lock)
                {
                    AuktionsNavn = navn;
                    mindstepris = pris;
                    AukMon.AccepteretBud = pris;    
                }

            }

            public void LytPåKlientListe() //lytter om der ændringer i tilmeldte
            {

                    while (Lyt == true)
                    {
                        int antal = broadCastListe.Count();

                            AntalByderEvent(antal);

                        
                    }

                
            }

            public void StopSignal()
            {
                Lyt = false;
            }

            //Properties
            public string AuktionsNavn
            {
                get { lock (this.read_update_lock) return auktionsNavn; }
                set { lock (this.read_update_lock) auktionsNavn = value; }
            }

            public int Mindstepris
            {
                get { lock (this.read_update_lock) return mindstepris; }
                set { lock (this.read_update_lock) mindstepris = value; }
            }

        }
    }


